package com.daisuxia.baofoo;

import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.daisuxia.baofoo.rsa.RsaCodingUtil;
import com.daisuxia.baofoo.util.HttpUtil;
import com.daisuxia.baofoo.util.JXMConvertUtil;
import com.daisuxia.baofoo.util.MapToXMLString;
import com.daisuxia.baofoo.util.SecurityUtil;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by dhl on 2017/6/19.
 */

public class XinyanAuthUtil extends BaseUtils{


	public static void main(String[] args) throws IOException {
		System.out.println(XinyanAuthUtil.sendSmsAuth(
				"03",
				"20170619212100",//yyyyMMddHHmmss
				"6217580800001693154",
				"340621198907314059",
				"任成龙",
				"13120806278"
		));
	}

	public static List<String> errorList = new ArrayList<String>();

	static {
		errorList.add("S0001");
		errorList.add("S1010");
		errorList.add("S1011");
		errorList.add("S1012");
		errorList.add("S1013");
		errorList.add("S1014");
		errorList.add("S1016");

	}

	private static Logger log = LoggerFactory.getLogger(XinyanAuthUtil.class);


	/**
	 * 发送银行卡短信验证码
	 * 由第三方发送
	 * @param trans_id_p
	 * @param trade_date_p
	 * @param acc_no_p
	 * @param id_card_p
	 * @param id_holder_p
	 * @param mobile_p
	 * @return
	 */
	public static Map sendSmsAuth(
			String trans_id_p,//商户订单号
			String trade_date_p,//订单交易时间日期 yyyyMMddHHmmss
			String acc_no_p,//银行卡号码
			String id_card_p,//身份证
			String id_holder_p,// 真实姓名
			String mobile_p //预留手机号
	) throws IOException {
		return Auth(trans_id_p,trade_date_p,acc_no_p,id_card_p,id_holder_p,mobile_p,"101","xy.authApplyUrl","","");
	}

	/**
	 * 短信正式校验
	 *
	 * @return
	 * @throws IOException
	 */
	public static Map realAuth(
			String trade_no_x_p,//交易流水
			String sms_code_p//短信验证码
	) throws IOException {
		return Auth("","","","","","","","xy.authConfirmUrl",trade_no_x_p,sms_code_p);
	}

	public static Map Auth(
			String trans_id_p,//订单日期
			String trade_date_p,//商户订单号
			String acc_no_p,//银行卡号码
			String id_card_p,//身份证
			String id_holder_p,// 真实姓名
			String mobile_p ,//预留手机号
			String card_type_p,//银行卡类型
			String type_p,//认证接口
			String trade_no_x_p,//交易流水
			String sms_code_p//短信验证码
	) throws IOException {
		String acc_no = acc_no_p;
		String id_card = id_card_p;
		String id_holder = id_holder_p;
		String mobile = mobile_p;
		String card_type=card_type_p;
		String type=type_p;
		String trade_no_x=trade_no_x_p;
		String sms_code=sms_code_p;
		log.info("=====输入的信息为：银行卡号(acc_no):"+acc_no+" ,持卡人证件号(id_card)："+id_card+" ,"
				+ "持卡人姓名(id_holder):"+id_holder+" ,银行预留手机号(mobile):"+mobile+""
				+ " ,卡片类型(card_type):"+card_type);
		/** 1、 商户号 **/
		String member_id=xymember_id;
		/**2、终端号 **/
		String terminal_id=xyterminal_id;
		/** 3、 加密数据类型 **/
		String data_type=xydate_type;
		/** 4、加密数据 **/
		String trans_id=trans_id_p;//""+System.currentTimeMillis();// 商户订单号
		String trade_date = trade_date_p;//new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());// 订单日期

		/** 组装参数 (13) **/
		String request_url= PropertiesUtil.get(type);
		Map<Object, Object> ArrayData = new HashMap<Object, Object>();
		if ("xy.authApplyUrl".equals(type)) {
			ArrayData.put("member_id", member_id);
			ArrayData.put("terminal_id", terminal_id);
			ArrayData.put("id_holder", id_holder);
			ArrayData.put("id_card", id_card);
			ArrayData.put("acc_no", acc_no);
			ArrayData.put("card_type", card_type);
			ArrayData.put("mobile", mobile);
			ArrayData.put("trans_id", trans_id);
			ArrayData.put("trade_date", trade_date);

		} else {
			ArrayData.put("member_id", member_id);
			ArrayData.put("terminal_id", terminal_id);
			ArrayData.put("trade_no", trade_no_x);
			ArrayData.put("sms_code", sms_code);

		}


		Map<Object, Object> ArrayData1 = new HashMap<Object, Object>();
		String XmlOrJson = "";
		if (data_type.equals("xml")) {
			ArrayData1.putAll(ArrayData);
			XmlOrJson = MapToXMLString.converter(ArrayData1, "data_content");
		} else {
			JSONObject jsonObjectFromMap = JSONObject.fromObject(ArrayData);
			XmlOrJson = jsonObjectFromMap.toString();
		}
		log.info(" 新颜 请求未加密参数 ="+ XmlOrJson);
		/** base64 编码 **/
		String base64str = SecurityUtil.Base64Encode(XmlOrJson);
		/** rsa加密  **/
		String pfxpath = xypfxpath;// 商户私钥
		File pfxfile = new File(pfxpath);
		if (!pfxfile.exists()) {
			throw new RuntimeException("私钥文件不存在！");
		}
		String pfxpwd = xycername;// 私钥密码

		String data_content = RsaCodingUtil.encryptByPriPfxFile(base64str, pfxpath, pfxpwd);//加密数据

		/**============== http 请求==================== **/
		log.info(" 新颜 请求加密参数 ="+ data_content);
		Map<String,String> HeadPostParam = new HashMap<String,String>();
		HeadPostParam.put("member_id", member_id);
		HeadPostParam.put("terminal_id", terminal_id);
		HeadPostParam.put("data_type", data_type);
		HeadPostParam.put("data_content",data_content);
//		String PostString  = HttpUtil.RequestForm(request_url, HeadPostParam);
		
		//TODO songss 模拟 请求 新颜 返回成功
		String PostString = "";
		if ("".equals(sms_code_p)) {//获取验证码进来的
			PostString = "{\"data\":{\"code\":\"2\",\"trade_no\":\"000000\"},\"success\":\"true\"}";
		}else {//验证 验证码
			PostString = "{\"data\":{\"code\":\"0\",\"trade_no\":\"000000\"},\"success\":\"true\"}";
		}
		//TODO songss 模拟结束
		
		log.info(" 新颜 返回参数 ="+PostString);
		Map<String, Object> ArrayDataString = JSONObject.fromObject(PostString);//将JSON转化为Map对象。
		return ArrayDataString;
	}
}
